package com.shenwei.yingdaoguanli.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 修正：排除目标 ZIP 文件自身，避免自包含
 */
public class FolderBackup {

    /**
     * 备份指定路径的文件夹为 .zip 文件
     *
     * @param sourceDirPath 文件夹路径
     * @param zipFilePath   输出的 .zip 文件路径
     * @throws IOException 如果发生 I/O 错误
     */
    public static Boolean backupFolderToZip(String sourceDirPath, String zipFilePath) throws IOException {
        Path sourceDir = Paths.get(sourceDirPath);
        Path zipFile = Paths.get(zipFilePath);

        if (!Files.exists(sourceDir) || !Files.isDirectory(sourceDir)) {
            throw new IllegalArgumentException("指定的路径不是有效的文件夹路径: " + sourceDirPath);
        }

        // 创建输出 ZIP 文件
        try (FileOutputStream fos = new FileOutputStream(zipFilePath);
             ZipOutputStream zos = new ZipOutputStream(fos)) {

            // 遍历文件夹中的内容，不包括根文件夹本身
            Files.walk(sourceDir)
                    .filter(path -> !Files.isDirectory(path)) // 过滤目录，只处理文件
                    .filter(path -> !path.equals(zipFile))    // 过滤掉目标 ZIP 文件自身
                    .forEach(path -> {
                        try {
                            // 相对路径，去掉根文件夹路径
                            Path relativePath = sourceDir.relativize(path);
                            ZipEntry zipEntry = new ZipEntry(relativePath.toString());
                            zos.putNextEntry(zipEntry);

                            // 写入文件内容到 ZIP
                            Files.copy(path, zos);
                            zos.closeEntry();
                        } catch (IOException e) {
                            System.err.println("无法添加文件到 ZIP: " + path + " - " + e.getMessage());
                        }
                    });
        }

        System.out.println("备份完成，已生成 ZIP 文件: " + zipFilePath);
        return true;
    }

    public static void main(String[] args) {
        try {
            // 示例：备份路径
            String sourceDirPath = "D:\\BI本地数据";
            String zipFilePath = "D:\\BI本地数据\\BI本地数据.zip";

            backupFolderToZip(sourceDirPath, zipFilePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String getZipSize(String zipFilePath) {
        File zipFile = new File(zipFilePath);

        // 检查文件是否存在并且是一个文件
        if (!zipFile.exists() || !zipFile.isFile()) {
            return "文件不存在";
        }

        // 获取文件大小
        long fileSizeInBytes = zipFile.length();

        // 转换为人类可读的大小
        return formatFileSize(fileSizeInBytes);
    }

    private static String formatFileSize(long size) {
        if (size < 1024) {
            return size + " B";
        } else if (size < 1024 * 1024) {
            return String.format("%.2f KB", size / 1024.0);
        } else if (size < 1024 * 1024 * 1024) {
            return String.format("%.2f MB", size / (1024.0 * 1024));
        } else {
            return String.format("%.2f GB", size / (1024.0 * 1024 * 1024));
        }
    }
}
